bitkeeper revision 1.66 (3e53893c7wyyfbM7-GjGqaH26vHDHw)
authorkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>
Wed, 19 Feb 2003 13:40:12 +0000 (13:40 +0000)
committerkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>
Wed, 19 Feb 2003 13:40:12 +0000 (13:40 +0000)
sched.h, mm.h, config.h, kernel.c, domain.c, dom0_ops.c, smpboot.c:
  Ripped out command-line construction from Xen. Guest OS can now move its mapping of shared_info page.

xen-2.4.16/arch/i386/smpboot.c
xen-2.4.16/common/dom0_ops.c
xen-2.4.16/common/domain.c
xen-2.4.16/common/kernel.c
xen-2.4.16/include/xeno/config.h
xen-2.4.16/include/xeno/mm.h
xen-2.4.16/include/xeno/sched.h

index 6afdd0ecfd74f6aae6ff51ce9227134582617add..0955db82f33b7021856821983abd475c5d30a033 100644 (file)
@@ -684,11 +684,9 @@ static void __init do_boot_cpu (int apicid)
     /*
      * We can't use kernel_thread since we must avoid to reschedule the child.
      */
-    if ( (idle = do_newdomain()) == NULL )
+    if ( (idle = do_newdomain(IDLE_DOMAIN_ID, cpu)) == NULL )
         panic("failed 'newdomain' for CPU %d", cpu);
  
-    idle->processor    = cpu;
-    idle->domain       = IDLE_DOMAIN_ID;
     pagetable = (void *)get_free_page(GFP_KERNEL);
     memcpy(pagetable, idle0_pg_table, PAGE_SIZE);
     idle_pg_table[cpu] = pagetable;
index 4d0caaa96a754c37fbf0411c0ef59a27daf30d3f..1d43f641ba43349d1cc8f9c1d50ae31c92224294 100644 (file)
@@ -90,14 +90,10 @@ long do_dom0_op(dom0_op_t *u_dom0_op)
         static unsigned int pro = 0;
         unsigned int dom = get_domnr();
         ret = -ENOMEM;
-        if ( !dom ) break;
-        p = do_newdomain();
-        if ( !p ) break;
-        p->domain = dom;
+        if ( dom == 0 ) break;
         pro = (pro+1) % smp_num_cpus;
-        p->processor = pro;
-
-        if ( dom == 0 ) BUG();
+        p = do_newdomain(dom, pro);
+        if ( p == NULL ) break;
 
         ret = alloc_new_dom_mem(p, op.u.newdomain.memory_kb);
         if ( ret != 0 ) break;
index d3f9ef2640cc3a6ad64368655a658688bb0457f0..9e5f3dd8b88df708c4e221242559ea06998a0d52 100644 (file)
@@ -28,7 +28,7 @@ rwlock_t tasklist_lock __cacheline_aligned = RW_LOCK_UNLOCKED;
 /*
  * create a new domain
  */
-struct task_struct *do_newdomain(void)
+struct task_struct *do_newdomain(unsigned int dom_id, unsigned int cpu)
 {
     int retval;
     struct task_struct *p = NULL;
@@ -38,8 +38,13 @@ struct task_struct *do_newdomain(void)
     p = alloc_task_struct();
     if (!p) goto newdomain_out;
     memset(p, 0, sizeof(*p));
+
+    p->domain    = dom_id;
+    p->processor = cpu;
+
     p->shared_info = (void *)get_free_page(GFP_KERNEL);
     memset(p->shared_info, 0, PAGE_SIZE);
+    SHARE_PFN_WITH_DOMAIN(virt_to_page(p->shared_info), dom_id);
 
     SET_GDT_ENTRIES(p, DEFAULT_GDT_ENTRIES);
     SET_GDT_ADDRESS(p, DEFAULT_GDT_ADDRESS);
@@ -212,6 +217,8 @@ void release_task(struct task_struct *p)
         destroy_net_vif(p);
     }
     if ( p->mm.perdomain_pt ) free_page((unsigned long)p->mm.perdomain_pt);
+
+    UNSHARE_PFN(virt_to_page(p->shared_info));
     free_page((unsigned long)p->shared_info);
 
     free_all_dom_mem(p);
@@ -220,39 +227,6 @@ void release_task(struct task_struct *p)
 }
 
 
-void construct_cmdline(char *dst, struct task_struct *p)
-{
-    int dom = p->domain;
-    unsigned char boot[150];
-    unsigned char ipbase[20], nfsserv[20], gateway[20], netmask[20];
-    unsigned char nfsroot[70];
-
-    if ( strcmp("",opt_nfsroot) )
-    {
-        /* NFS root for Xenolinux. */
-        snprintf(nfsroot, 70, opt_nfsroot, dom); 
-        snprintf(boot, 200,
-                " root=/dev/nfs ip=%s:%s:%s:%s::eth0:off nfsroot=%s",
-                 quad_to_str(opt_ipbase + dom, ipbase),
-                 quad_to_str(opt_nfsserv, nfsserv),
-                 quad_to_str(opt_gateway, gateway),
-                 quad_to_str(opt_netmask, netmask),
-                 nfsroot);
-    }
-    else
-    {   
-        /* Non-NFS root for Xenolinux. */
-        snprintf(boot, 200,
-                " ip=%s::%s:%s::eth0:off",
-                 quad_to_str(opt_ipbase + dom, ipbase),
-                 quad_to_str(opt_gateway, gateway),
-                 quad_to_str(opt_netmask, netmask));
-    }
-
-    strcpy(dst, boot);
-}
-
-
 /* final_setup_guestos is used for final setup and launching of domains other
  * than domain 0. ie. the domains that are being built by the userspace dom0
  * domain builder.
@@ -280,8 +254,6 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
     unsigned long phys_l2tab;
     net_ring_t *net_ring;
     net_vif_t *net_vif;
-    char *dst;    // temporary
-    int i;        // temporary
 
     /* entries 0xe0000000 onwards in page table must contain hypervisor
      * mem mappings - set them up.
@@ -346,19 +318,8 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo)
     /* Add block io interface */
     virt_startinfo_addr->blk_ring = (blk_ring_t *)SH2G(p->blk_ring_base);
 
-    dst = virt_startinfo_addr->cmd_line;
-    if ( mod[0].string )
-    {
-        char *modline = (char *)__va(mod[0].string);
-        for ( i = 0; i < 255; i++ )
-        {
-            if ( modline[i] == '\0' ) break;
-            *dst++ = modline[i];
-        }
-    }
-    *dst = '\0';
-
-    construct_cmdline(dst, p);
+    /* Copy the command line */
+    strcpy(virt_startinfo_addr->cmd_line, meminfo->cmd_line);
 
     /* Reinstate the caller's page tables. */
     __asm__ __volatile__ (
@@ -612,9 +573,6 @@ int setup_guestos(struct task_struct *p, dom0_newdomain_t *params)
     }
     *dst = '\0';
 
-    construct_cmdline(dst, p);
-
-
     /* Reinstate the caller's page tables. */
     __write_cr3_counted(pagetable_val(current->mm.pagetable));
     __sti();
index eaab8e940b1889367d025c910542b36e6f06181e..5b7ec546bf3cd72a87d624da99afa731d702738c 100644 (file)
@@ -41,8 +41,7 @@ void init_serial(void);
 void start_of_day(void);
 
 /* Command line options and variables. */
-unsigned long opt_ipbase=0, opt_nfsserv=0, opt_gateway=0, opt_netmask=0;
-unsigned char opt_nfsroot[50]="";
+unsigned long opt_dom0_ip = 0;
 unsigned int opt_dom0_mem = 16000; /* default kbytes for DOM0 */
 unsigned int opt_ne_base = 0; /* NE2k NICs cannot be probed */
 unsigned char opt_ifname[10] = "eth0";
@@ -52,11 +51,7 @@ static struct {
     int type;
     void *var;
 } opts[] = {
-    { "ipbase",   OPT_IP,   &opt_ipbase  },
-    { "nfsserv",  OPT_IP,   &opt_nfsserv },
-    { "gateway",  OPT_IP,   &opt_gateway },
-    { "netmask",  OPT_IP,   &opt_netmask },
-    { "nfsroot",  OPT_STR,  &opt_nfsroot },
+    { "dom0_ip",  OPT_IP,   &opt_dom0_ip },
     { "dom0_mem", OPT_UINT, &opt_dom0_mem }, 
     { "ne_base",  OPT_UINT, &opt_ne_base },
     { "ifname",   OPT_STR,  &opt_ifname },
@@ -178,12 +173,14 @@ void cmain (unsigned long magic, multiboot_info_t *mbi)
     /* Create initial domain 0. */
     dom0_params.num_vifs  = 1;
     dom0_params.memory_kb = opt_dom0_mem;
-    add_default_net_rule(0, opt_ipbase); // add vfr info for dom0
 
-    new_dom = do_newdomain();
+    if ( opt_dom0_ip == 0 )
+        panic("Must specify an IP address for domain 0!\n");
+
+    add_default_net_rule(0, opt_dom0_ip); // add vfr info for dom0
+
+    new_dom = do_newdomain(0, 0);
     if ( new_dom == NULL ) panic("Error creating domain 0\n");
-    new_dom->processor = 0;
-    new_dom->domain    = 0;
     if ( setup_guestos(new_dom, &dom0_params) != 0 )
     {
         panic("Could not set up DOM0 guest OS\n");
@@ -435,7 +432,7 @@ int console_export(char *str, int len)
     iph->id      = 0xdead;
     iph->ttl     = 255;
     iph->protocol= 17;
-    iph->daddr   = htonl(opt_ipbase);
+    iph->daddr   = htonl(opt_dom0_ip);
     iph->saddr   = htonl(0xa9fe0001); 
     iph->tot_len = htons(hdr_size + len); 
     iph->check  = 0;
index 07b031e71ff2468553be86b8bbbc963524b94c97..7d7205b69aef1a9bb3525f684c4889ee606bafa4 100644 (file)
 #define capable(_c) 0
 
 #ifndef __ASSEMBLY__
-extern unsigned long opt_ipbase, opt_nfsserv, opt_gateway, opt_netmask;
-extern unsigned char opt_nfsroot[];
 extern void __out_of_line_bug(int line) __attribute__((noreturn));
 #define out_of_line_bug() __out_of_line_bug(__LINE__)
 #endif
index 0187e21bb41639cf97d6335243acbcb97076a89a..6605f1ed58f2788d51a6b992eea9e6a41510328e 100644 (file)
@@ -104,6 +104,15 @@ typedef struct pfn_info {
 #define PageSetSlab(page)      set_bit(PG_slab, &(page)->flags)
 #define PageClearSlab(page)    clear_bit(PG_slab, &(page)->flags)
 
+#define SHARE_PFN_WITH_DOMAIN(_pfn, _dom)            \
+    do {                                             \
+        (_pfn)->flags = (_dom) | PGT_writeable_page; \
+        (_pfn)->tot_count = (_pfn)->type_count = 1;  \
+    } while ( 0 )
+
+#define UNSHARE_PFN(_pfn) \
+    (_pfn)->flags = (_pfn)->type_count = (_pfn)->tot_count = 0
+
 /* The array of struct pfn_info,  
  * free pfn list and number of free pfns in the free list
  */
index c77c0e835ef64fa5c63fa8eb4df3895a92c54798..ec65902fef7dd661d7fdb46528df3bfc29785fde 100644 (file)
@@ -155,7 +155,7 @@ union task_union {
 extern union task_union idle0_task_union;
 extern struct task_struct first_task_struct;
 
-extern struct task_struct *do_newdomain(void);
+extern struct task_struct *do_newdomain(unsigned int dom_id, unsigned int cpu);
 extern int setup_guestos(struct task_struct *p, dom0_newdomain_t *params);
 extern int final_setup_guestos(struct task_struct *p, dom_meminfo_t *);